/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 项目名：	rumba
 * 文件名：	QMenuReader.java
 * 模块说明：	
 * 修改历史：
 * Dec 19, 2007 - lxm - 创建。
 */
package com.hd123.rumba.gwt.entry.server.menu;

import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.gwt.base.client.exception.ClientBizException;
import com.hd123.rumba.gwt.entry.client.menu.QMenu;
import com.hd123.rumba.gwt.entry.client.menu.QMenuItem;
import com.hd123.rumba.navigation.menu.BMenu;
import com.hd123.rumba.navigation.menu.BMenuItem;
import com.hd123.rumba.util.ObjectUtil;

/**
 * 菜单 | 业务层.查询 | 阅读器
 * 
 * @author lxm
 * 
 */
public class QMenuReader {

  /**
   * 从指定的持久层对象读取数据到通过{@link #setTarget()}所指定的作为目标的业务层对象。
   * 
   * @param source
   *          指定的持久层对象，作为赋值的源。不可为null。
   * @throws ClientBizException
   */
  public void read(BMenu source) throws BusinessException {
    ObjectUtil.checkParameterNotNull(source, "source");
    if (target == null)
      throw new BusinessException("属性target不可为null。");

    readChildren(source, null, null);
  }

  private QMenu target;

  public QMenu getTarget() {
    return target;
  }

  public void setTarget(QMenu target) {
    this.target = target;
  }

  private void readChildren(BMenu source, BMenuItem sourceParent, QMenuItem targetParent)
      throws BusinessException {
    QMenuItemReader reader = new QMenuItemReader();
    BMenuItem sourceChild = source.getFirstChild(sourceParent);
    try {
      while (sourceChild != null) {

        reader.setTarget(new QMenuItem());
        reader.read(sourceChild);
        this.target.add(reader.getTarget(), targetParent);

        readChildren(source, sourceChild, reader.getTarget());

        sourceChild = source.getNextItem(sourceChild);
      }
    } catch (ClientBizException e) {
      throw new BusinessException(e);
    }
  }

}
